#ifndef __myfunc1__
#define __myfunc1__

#include <GyverShift.h>

// 定义命名空间
namespace segmet1 {

GyverShift<OUTPUT, 2> outp(CS_595, DAT_595_1, CLK_595);

unsigned char _s = SEG01;
bool _r = r1;

void getsvar() {
  _s = SEG01;
  _r = r1;
}

// ============================================
// ========== 以下代码各字段完全相同 ============
// ============================================

// 保存字段的状态，反面的要求到反面可不理会，以节约时间
bool _t0 = 0;
bool _t1 = 0;
bool _t2 = 0;
bool _t3 = 0;
bool _t4 = 0;
bool _t5 = 0;
bool _t6 = 0;

// 停止输出，省电
void off() {
  outp[0] = 0;
  outp[1] = 0;
  outp[2] = 0;
  outp[3] = 0;
  outp[4] = 0;
  outp[5] = 0;
  outp[6] = 0;
  outp[7] = 0;
  outp[8] = 0;
  outp[9] = 0;
  outp[10] = 0;
  outp[11] = 0;
  outp[12] = 0;
  outp[13] = 0;
  outp[14] = 0;
  outp[15] = 0;
  outp.update();
}

// 翻转字段电磁铁通电保持时间d2，时间不宜太长，否则耗电，时间太短，又可能翻转不了
// 不翻转字段电磁铁通电时间d1，防止字段之前状态不对
// 翻转完延时d3

// 显示字段子程序
void set0(bool _b) {
  if (!_b) {
    outp[0] = bitRead(_s, 7);
    outp[1] = !bitRead(_s, 7);
  } else {
    outp[0] = !bitRead(_s, 7);
    outp[1] = bitRead(_s, 7);
  }
  outp.update();
  delay(_b == _t0 ? d2 : d1);
  _t0 = _b;
  off();
  delay(d3);
}

void set1(bool _b) {
  if (!_b) {
    outp[2] = bitRead(_s, 6);
    outp[3] = !bitRead(_s, 6);
  } else {
    outp[2] = !bitRead(_s, 6);
    outp[3] = bitRead(_s, 6);
  }
  outp.update();
  delay(_b == _t1 ? d2 : d1);
  _t1 = _b;
  off();
  delay(d3);
}

void set2(bool _b) {
  if (!_b) {
    outp[4] = bitRead(_s, 5);
    outp[5] = !bitRead(_s, 5);
  } else {
    outp[4] = !bitRead(_s, 5);
    outp[5] = bitRead(_s, 5);
  }
  outp.update();
  delay(_b == _t2 ? d2 : d1);
  _t2 = _b;
  off();
  delay(d3);
}

void set3(bool _b) {
  if (!_b) {
    outp[6] = bitRead(_s, 4);
    outp[7] = !bitRead(_s, 4);
    outp[8] = bitRead(_s, 4);
    outp[9] = !bitRead(_s, 4);
  } else {
    outp[6] = !bitRead(_s, 4);
    outp[7] = bitRead(_s, 4);
    outp[8] = !bitRead(_s, 4);
    outp[9] = bitRead(_s, 4);
  }
  outp.update();
  delay(_b == _t3 ? d2 : d1);
  _t3 = _b;
  off();
  delay(d3);
}

void set4(bool _b) {
  if (!_b) {
    outp[10] = bitRead(_s, 3);
    outp[11] = !bitRead(_s, 3);
  } else {
    outp[10] = !bitRead(_s, 3);
    outp[11] = bitRead(_s, 3);
  }
  outp.update();
  delay(_b == _t4 ? d2 : d1);
  _t4 = _b;
  off();
  delay(d3);
}

void set5(bool _b) {
  if (!_b) {
    outp[12] = bitRead(_s, 2);
    outp[13] = !bitRead(_s, 2);
  } else {
    outp[12] = !bitRead(_s, 2);
    outp[13] = bitRead(_s, 2);
  }
  outp.update();
  delay(_b == _t5 ? d2 : d1);
  _t5 = _b;
  off();
  delay(d3);
}

void set6(bool _b) {
  if (!_b) {
    outp[14] = bitRead(_s, 1);
    outp[15] = !bitRead(_s, 1);
  } else {
    outp[14] = !bitRead(_s, 1);
    outp[15] = bitRead(_s, 1);
  }
  outp.update();
  delay(_b == _t6 ? d2 : d1);
  _t6 = _b;
  off();
  delay(d3);
}

// 显示数字子程序
void showno() {
  _t0 = 1;
  _t1 = 1;
  _t2 = 1;
  _t3 = 1;
  _t4 = 1;
  _t5 = 1;
  _t6 = 1;
  if (_r) {
    set6(0);
    set5(0);
    set4(0);
    set3(0);
    set2(0);
    set1(0);
    set0(0);
  } else {
    set0(0);
    set1(0);
    set2(0);
    set3(0);
    set4(0);
    set5(0);
    set6(0);
  }
}

void show0() {
  if (_r) {
    set6(1);
    set5(1);
    set4(1);
    set3(0);
    set2(1);
    set1(1);
    set0(1);
  } else {
    set0(1);
    set1(1);
    set2(1);
    set3(0);
    set4(1);
    set5(1);
    set6(1);
  }
}

void show1() {
  if (_r) {
    set6(0);
    set5(5);
    set4(0);
    set3(0);
    set2(2);
    set1(0);
    set0(0);
  } else {
    set0(0);
    set1(1);
    set2(0);
    set3(0);
    set4(1);
    set5(0);
    set6(0);
  }
}

void show2() {
  if (_r) {
    set6(1);
    set5(1);
    set4(0);
    set3(1);
    set2(0);
    set1(1);
    set0(1);
  } else {
    set0(1);
    set1(1);
    set2(0);
    set3(1);
    set4(0);
    set5(1);
    set6(1);
  }
}

void show3() {
  if (_r) {
    set6(1);
    set5(1);
    set4(0);
    set3(1);
    set2(1);
    set1(0);
    set0(1);
  } else {
    set0(1);
    set1(1);
    set2(0);
    set3(1);
    set4(1);
    set5(0);
    set6(1);
  }
}

void show4() {
  if (_r) {
    set6(0);
    set5(1);
    set4(1);
    set3(1);
    set2(1);
    set1(0);
    set0(0);
  } else {
    set0(0);
    set1(1);
    set2(1);
    set3(1);
    set4(1);
    set5(0);
    set6(0);
  }
}

void show5() {
  if (_r) {
    set6(1);
    set5(0);
    set4(1);
    set3(1);
    set2(1);
    set1(0);
    set0(1);
  } else {
    set0(1);
    set1(0);
    set2(1);
    set3(1);
    set4(1);
    set5(0);
    set6(1);
  }
}

void show6() {
  if (_r) {
    set6(1);
    set5(0);
    set4(1);
    set3(1);
    set2(1);
    set1(1);
    set0(1);
  } else {
    set0(1);
    set1(0);
    set2(1);
    set3(1);
    set4(1);
    set5(1);
    set6(1);
  }
}

void show7() {
  if (_r) {
    set6(1);
    set5(1);
    set4(0);
    set3(0);
    set2(1);
    set1(0);
    set0(0);
  } else {
    set0(1);
    set1(1);
    set2(0);
    set3(0);
    set4(1);
    set5(0);
    set6(0);
  }
}

void show8() {
  if (_r) {
    set6(1);
    set5(1);
    set4(1);
    set3(1);
    set2(1);
    set1(1);
    set0(1);
  } else {
  }
  set0(1);
  set1(1);
  set2(1);
  set3(1);
  set4(1);
  set5(1);
  set6(1);
}

void show9() {
  if (_r) {
    set6(1);
    set5(1);
    set4(1);
    set3(1);
    set2(1);
    set1(0);
    set0(1);
  } else {
    set0(1);
    set1(1);
    set2(1);
    set3(1);
    set4(1);
    set5(0);
    set6(1);
  }
}

void showmo(uint8_t seg) {
  if (_r) {
    switch (seg) {
      case 0:
        set6(false);
        delay(d4);
        set6(true);
        break;
      case 1:
        set5(false);
        delay(d4);
        set5(true);
        break;
      case 2:
        set4(false);
        delay(d4);
        set4(true);
        break;
      case 3:
        set3(false);
        delay(d4);
        set3(true);
        break;
      case 4:
        set2(false);
        delay(d4);
        set2(true);
        break;
      case 5:
        set1(false);
        delay(d4);
        set1(true);
        break;
      case 6:
        set0(false);
        delay(d4);
        set0(true);
        break;
    }
  } else {
    switch (seg) {
      case 0:
        set0(false);
        delay(d4);
        set0(true);
        break;
      case 1:
        set1(false);
        delay(d4);
        set1(true);
        break;
      case 2:
        set2(false);
        delay(d4);
        set2(true);
        break;
      case 3:
        set3(false);
        delay(d4);
        set3(true);
        break;
      case 4:
        set4(false);
        delay(d4);
        set4(true);
        break;
      case 5:
        set5(false);
        delay(d4);
        set5(true);
        break;
      case 6:
        set6(false);
        delay(d4);
        set6(true);
        break;
    }
  }
}

void showtx() {
  if (_r) {
    set0(0);
    set1(1);
    set2(1);
    set3(0);
    set4(0);
    set5(1);
    set6(0);
  } else {
    set0(0);
    set1(1);
    set2(0);
    set3(0);
    set4(1);
    set5(1);
    set6(0);
  }
}

void showhx() {
  set0(0);
  set1(0);
  set2(0);
  set3(1);
  set4(0);
  set5(0);
  set6(0);
}

}

#endif